package cn.gorit.user.service;

import java.util.List;
import java.util.UUID;
import cn.gorit.common.enums.ResultEnums;
import cn.gorit.common.lang.Result;
import cn.gorit.dto.user.LoginDto;
import cn.gorit.dto.user.RegDto;
import cn.gorit.dto.user.UserDto;
import cn.gorit.entity.user.User;
import cn.gorit.mapper.user.UserMapper;
import cn.gorit.utils.Page;
import cn.gorit.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * @version v1.0
 * @Classname UserService
 * @Description 前台所有相关的 API 接口
 * @Author Gorit
 * @Created by 2021/3/8 23:54
 * @IDLE IntelliJ IDEA
 **/
@Service
@Transactional(rollbackFor = Exception.class)
public class UserService {

    private Logger log = LoggerFactory.getLogger(UserService.class);
    /**
     * 接下来的工作：接口测试
     * 自定义异常。。
     */

    @Resource
    private UserMapper mapper;

    // 用户注册
    public Result<Object> reg(RegDto dto) {
        dto.setUserId(UUID.randomUUID().toString().replace("-","")); // 设置 UUID
        mapper.save(dto);
        return new Result<>(ResultEnums.ADD_SUCCESS.getCode(),"注册成功");
    }

    // 用户登录的 业务逻辑 的方法
    public Result<Object> login(LoginDto dto) {
        if (dto == null || StringUtils.isBlank(dto.getUsername())) {
            return new Result<>(ResultEnums.PARAMS_NULL.getCode(),ResultEnums.PARAMS_NULL.getMsg());
        }
        UserDto user = mapper.getByUsername(dto.getUsername());
        if (user.getUserId() == null) {
            return new Result<>(ResultEnums.LOGIN_FAILED.getCode(),ResultEnums.LOGIN_FAILED.getMsg());
        }
        if (dto.getPassword().equals(user.getPassword())) {
            user.setPassword(null); // 注释掉密码
            // auth 认证授权，生成 token 返回给前端
            return new Result<>(ResultEnums.LOGIN_SUCCESS.getCode(),ResultEnums.LOGIN_SUCCESS.getMsg(),user);
        }
        return new Result<>(ResultEnums.USERNAME_OR_PASSWORD_NOT_CORRECT.getCode(),ResultEnums.USERNAME_OR_PASSWORD_NOT_CORRECT.getMsg());
    }

    // 前台查询用户的信息
    public Result<User> getUserById(String id) {
        User user = mapper.getInfoById(id);
        user.setPassword("");
        return new Result<>(20002,"查询成功",user);
    }

    // 前台更新用户信息
    public Result<Object> updateInfo(User user) {
        try {
            mapper.update(user);
        } catch (Exception e) {
            throw new RuntimeException("更新出错");
        }
        return new Result<Object>("更新成功!"); // 后期采用枚举的形式更新
    }

    // *** 用户注销
    public Result<Object> logOff(String id) {
        // 用户注销，更新一下 status 状态码
        try {
             mapper.deleteById(id); 
        } catch (Exception e) {
            throw new RuntimeException("更新状态码");
        }
        return new Result<Object>("注销成功~");
    }

    // 后台分页获取用户列表参数, 下次开发记得增加 UserDto。后台只展示必要的数据，做一个简单地额 map 映射
    public Page<User> getByPage(Page<User> page) {
        // 查询数据
        List<User> useList = mapper.getByPage(page);
        page.setList(useList);
        // 查询总数
        int totalCount = mapper.getCountByPage(page);
        page.setTotalCount(totalCount);
        return page;
    }

    // 冻结用户
    public Result<Object> freezeUser(String id,Integer deleted) {
        // deleted = -1 表示账号冻结，1 表示逻辑删除
        Integer res = mapper.freezeUser(id,deleted);
        if (res > 0)
            return new Result<>(ResultEnums.FREEZE_SUCCESS.getCode(),ResultEnums.FREEZE_SUCCESS.getMsg());
        return new Result<>(ResultEnums.FREEZE_FAILED.getCode(),ResultEnums.FREEZE_FAILED.getMsg());
    }
}
